#include <iostream>
using namespace std;
template <typename T> class List {
private:
  int maxSize;
  int curlen;
  T *array;

public:
  void clear();                            //置空线性表
  bool isEmpty();                          //判断线性表是否未空
  bool append(const T value);              //添加元素value到线性表末尾
  bool insert(const int p, const T value); //插入value到位置p
  bool remove(const int p);                //删除位置p的元素
  int getPos(const T value);               //获取value所在的位置
  bool setValue(const int p, const T value); //设置位置p的值为value
  bool check(const int p);                   //检查位置p是否合法
  int getLen();                              //获取线性表长度
  void show();                               //显示线性表元素
  List(const int n);                         //线性表构造函数
  ~List();                                   //线性表析构函数
};

template <typename T> List<T>::List(const int n) {
  maxSize = n;
  array = new T[maxSize];
  curlen = 0;
}
template <typename T> List<T>::~List() { delete[] array; }
template <typename T> bool List<T>::check(const int p) {
  if (p > maxSize - 1) {
    cerr << "大于顺序表允许的最大长度" << endl;
    return false;
  } else if (p < 0 || p > curlen - 1) {
    cerr << "非法访问元素" << endl;
    return false;
  } else {
    return true;
  }
}
template <typename T> void List<T>::clear() {
  for (int i = 0; i < curlen - 1; i++) {
    array[i] = 0;
  }
}
template <typename T> bool List<T>::isEmpty() {
  if (curlen == 0)
    return true;
  else
    return false;
}
template <typename T> bool List<T>::append(const T value) {
  if (curlen < maxSize && curlen >= 0) {
    array[curlen] = value;
    curlen++;
    return true;
  }
  cerr << "越界操作";
  return false;
}
template <typename T> bool List<T>::insert(const int p, const T value) {
  if (check(p)) {
    for (int i = curlen; i > p; i--) {
      array[curlen] = array[curlen - 1];
    }
    array[p] = value;
    curlen++;
    return true;
  } else
    return false;
}

template <typename T> bool List<T>::remove(const int p) {
  if (check(p)) {
    for (int i = p; i < curlen - 1; i++) {
      array[i] = array[i + 1];
    }
    curlen--;
    return true;
  } else
    return false;
}
template <typename T> int List<T>::getPos(const T value) {
  for (int i = 0; i < curlen; i++) {
    if (array[i] == value)
      return i;
  }
  return -1;
}
template <typename T> bool List<T>::setValue(const int p, const T value) {
  if (check(p)) {
    array[p] = value;
    return true;
  }
  return false;
}
template <typename T> void List<T>::show() {
  if (curlen > 0 && curlen <= maxSize) {
    for (int i = 0; i < curlen; i++)
      cout << array[i] << " ";
  }
  cout << endl;
}
template <typename T> int List<T>::getLen() { return curlen; }
